home *** CD-ROM | disk | FTP | other *** search
/ MASPC 1 / MASPC_1.iso / Demos / Demo DIV / DATA / PRG / JUEGOS / MALVADO.PRG < prev    next >
Encoding:
Text File  |  1997-12-01  |  74.7 KB  |  1,865 lines

  1.  
  2. //-----------------------------------------------------------------------------
  3. // TITULO:      CASTLE OF DR MALVADO
  4. // AUTOR:       DANIEL NAVARRO
  5. // FECHA:       01/02/97
  6. //-----------------------------------------------------------------------------
  7.  
  8. PROGRAM castle_of_dr_malvado;
  9.  
  10. GLOBAL
  11.     nivel=1;         // Numero de niveles
  12.     vidas=3;         // Numero de vidas
  13.     puntos=0;        // Variable para la puntuación
  14.     bonos=0;         // Numero de bonos recogidos
  15.     fuente1,fuente2; // Identificadores de las fuentes
  16.  
  17.     s_pez;           // Identificador para el sonido de los peces
  18.     s_toque;         // Identificador para el sonido de los toques
  19.     s_estrella;      // Identificador para el sonido de estrellas
  20.     s_araña;         // Identificador para el sonido de las arañas
  21.     s_oso;           // Identificador para el sonido de los osos
  22.     s_abeja;         // Identificador para el sonido de abejorro
  23.     s_fantasma;      // Identificador para el sonido de fantasma
  24.     s_salto1;        // Identificador para el primer sonido de salto
  25.     s_salto2;        // Identificador para el segundo sonido de salto
  26.     s_caida;         // Identificador para el sonido de caída
  27.     s_burbuja;       // Identificador para el sonido de las burbujas
  28.     s_bonos;         // Identificador para el sonido de recogida de bonos
  29.     s_malvado;       // Identificador para cuando muere el Doctor malvado
  30.  
  31.     energia_enemigo;    // Variable para el nivel de energía enemigos fin de fase
  32.     id_barra_enemigo;   // Identificador para quitar la barra de energía
  33.     fin_nivel=false;    // Variable para controlar si se ha terminado un nivel
  34.     idtextovida;        // Variables que manejan el texto cuando sale una vida
  35.     contadortextovida;
  36.     contextovida=0;
  37.     idprincipal;
  38. LOCAL
  39.     velocidad_gravedad; // Variable para guardar la velocidad de caída (gravedad)
  40.     velocidad=0;        // Variable para guardar la velocidad horizontal del protagonista
  41.     muerte;             // Variable para guardar si el protagonista esta muerto
  42.     angulo2;            // Variable de uso general ángulos.
  43. IMPORT "ss1.dll";
  44. PRIVATE
  45.     pantalla=1;         // Pantalla que se ve como menú
  46.     saliendo=0;         // 1= Se quiere salir del juego
  47. BEGIN
  48.  
  49.     idprincipal=id;
  50.     set_fps(24,4);      // Velocidad 24 pantallas por segundo
  51.                         //  con un máximo de saltos de 4 pantallas
  52.     // Carga el fichero de gráficos general
  53.     load_fpg("malvado\malvado.fpg");
  54.  
  55.     // Carga los ficheros de fuentes de las letras
  56.     fuente1=load_fnt("malvado\numero.fnt");
  57.     fuente2=load_fnt("malvado\letras.fnt");
  58.  
  59.     // Carga sonidos
  60.     s_pez=load_pcm("malvado\pez.pcm",0);       // Sonido de peces
  61.     s_toque=load_pcm("malvado\golpe.pcm",0);      // Sonido de toque
  62.     s_estrella=load_pcm("malvado\estrella.pcm",0);  // Sonido de estrellas
  63.     s_araña=load_pcm("malvado\aracnido.pcm",0);   // Sonido de la araña
  64.     s_oso=load_pcm("malvado\oso.pcm",0);       // Sonido del oso
  65.     s_abeja=load_pcm("malvado\abeja.pcm",0);    // Sonido del abejorro
  66.     s_fantasma=load_pcm("malvado\fantasma.pcm",0); // Sonido del fantasma
  67.     s_salto1=load_pcm("malvado\salto1.pcm",0);   // Sonido de salto uno
  68.     s_salto2=load_pcm("malvado\salto2.pcm",0);   // Sonido de salto dos
  69.     s_caida=load_pcm("malvado\caida.pcm",0);     // Sonido de caída
  70.     s_burbuja=load_pcm("malvado\burbuja.pcm",0);    // Sonido de burbujas
  71.     s_bonos=load_pcm("malvado\bonus.pcm",0);    // Sonido de bonos
  72.     s_malvado=load_pcm("malvado\malvado.pcm",0);    // Sonido de muerte de malvado
  73.  
  74.     LOOP                    // Bucle principal
  75.         timer=1000;         // Se inicializa fuera de tiempo para cambiar nada mas entrar
  76.         pantalla=3;         // Elige la otra pantalla porque cambia nada mas entrar
  77.  
  78.         REPEAT                              // Bucle de pantallas de presentación
  79.             IF (timer>500)                  // Si pasa 5 segundos cambia de pantalla
  80.                 timer=0;
  81.                 IF (pantalla==1)
  82.                     pantalla=3;             //  3:Pantalla créditos
  83.                 ELSE
  84.                     pantalla=1;
  85.                 END                         //  1:Pantalla de menú
  86.                 fade_off();
  87.                 put_screen(0,pantalla);
  88.                 fade_on();
  89.             END
  90.             angle+=10000;
  91.             FRAME;
  92.         until (scan_code<>0);
  93.         // Espera a que se pulse una tecla
  94.  
  95.         // Si has pulsado ESCAPE sal directamente del programa
  96.         IF (key(_esc))
  97.             fade_off();
  98.             exit("Gracias por jugar!",0);
  99.         END
  100.  
  101.         fade_off();                     // Apaga pantalla
  102.         // Inicializa variables de juego
  103.         // Fase=1, vidas=3, puntuacion=0, bonus=0
  104.         nivel=1;
  105.         vidas=3;
  106.         puntos=0;
  107.         bonos=0;
  108.  
  109.         REPEAT              // Bucle para pantalla de espera de carga
  110.             fade_on();      // Enciende la pantalla
  111.             put_screen(0,2);// Pinta pantalla de fondo
  112.             write(fuente2,138,77,4,"NIVEL");
  113.             write_int(fuente2,208,77,4,&nivel);
  114.             WHILE (fading)  // Espera mientras inicia todo, que
  115.                 FRAME;      // que será al acabar el apagado de pantalla
  116.             END
  117.             delete_text(all_text);
  118.             // Coloca marcadores de puntos, vidas y bonos
  119.             objeto(0,222,16,16,-512,0);     // Pinta vidas
  120.             write(fuente1,36,16,4,"x");
  121.             write_int(fuente1,44,16,3,&vidas);
  122.             write_int(fuente1,160,16,4,&puntos);  // Pinta puntuación
  123.             objeto(0,216,270,17,-512,0);    // Pinta bonos
  124.             write(fuente1,288,16,4,"x");
  125.             write_int(fuente1,296,16,3,&bonos);
  126.             fin_nivel=false;                // Inicializa variable
  127.                                             // controladora de fin de fase
  128.             // Pone textos al iniciar un nivel
  129.             SWITCH (nivel)      // Bucle para niveles
  130.                 CASE 1:         // Inicializa nivel uno
  131.                     // Carga el bloque de gráficos del nivel uno
  132.                     load_fpg("malvado\nivel1.fpg");
  133.  
  134.                     // Inicializa scroll
  135.                     start_scroll(0,1,1,3,0,4);
  136.                     // Define la zona del scroll a partir de la cual se mueve
  137.                     scroll.region1=define_region(1,96,100,1,1);
  138.  
  139.  
  140.                     // Inicializa objetos que tapan otros objetos
  141.                     objeto(1,20,2080,122,-256,1); // Gráficos para marcos de puertas
  142.                     objeto(1,21,2102,34,-256,1);
  143.                     objeto(1,22,3286,72,32,1);    // Gráfico para tapar burbujas (caldero)
  144.  
  145.                     // Inicializa objetos de primer plano
  146.                     primer_plano(12,200);        // Planta de junco
  147.                     primer_plano(10,500);        // Señal de dirección a castillo
  148.                     primer_plano(11,780);        // Tumba
  149.                     primer_plano(12,1300);       // Planta de junco
  150.                     primer_plano(13,2150);       // Vela
  151.                     primer_plano(13,2800);       // Vela
  152.  
  153.                     // Inicializa objetos de cadenas de plataformas
  154.                     cadena(2840,8,0,pi/48,pi/4);
  155.                     cadena(3133,8,pi,pi/32,pi/4);
  156.                     cadena(3660,80,0,pi/24,pi/4);
  157.  
  158.                     // Inicializa el objeto del protagonista
  159.                     jack(8,0);
  160.  
  161.                     // Inicializa objetos osos
  162.                     oso(82,189,-1);
  163.                     oso(256,274,-2);
  164.                     oso(484,158,-3);
  165.                     oso(580,247,-2);
  166.                     oso(798,189,-3);
  167.                     oso(1053,191,-3);
  168.                     oso(1675,100,-4);
  169.                     oso(2036,175,-6);
  170.  
  171.                     // Inicializa objetos abejorro
  172.                     voladores(310,0,600,140,110,64,100,64);
  173.                     voladores(310,0,900,140,110,64,160,100);
  174.                     voladores(310,0,1300,170,90,48,200,50);
  175.                     voladores(310,0,1320,150,95,60,150,75);
  176.                     voladores(310,0,1820,100,48,36,64,64);
  177.  
  178.                     // Inicializa objetos fantasma
  179.                     voladores(320,4,2170,100,48,36,64,64);
  180.                     voladores(320,4,2329,224,100,24,220,32);
  181.                     voladores(320,4,2865,100,48,36,96,96);
  182.                     voladores(320,4,3100,64,100,36,96,96);
  183.  
  184.                     // Inicializa objetos araña
  185.                     araña(2349,63,65);
  186.                     araña(2218,152,78);
  187.                     araña(2534,0,77);
  188.  
  189.                     // Inicializa objetos fuego
  190.                     fuego(2280,256,10);
  191.                     fuego(2390,256,11);
  192.  
  193.                     // Coge puntos de control del mapa para bonos
  194.                     FROM z=0 TO 25;
  195.                         get_point(1,1,z,&x,&y); // Coge punto
  196.                         bono(x,y);              // Pon bonos
  197.                     END
  198.                 END
  199.  
  200.                 CASE 2:         // Inicializa nivel dos
  201.                     // Carga fichero de gráficos para nivel dos
  202.                     load_fpg("malvado\nivel2.fpg");
  203.  
  204.                     // Inicializa scroll para nivel 2
  205.                     start_scroll(0,1,1,3,0,4);
  206.                     // Selecciona la zona del scroll a partir de donde se mueve
  207.                     scroll.region1=define_region(1,160,150,1,1);
  208.  
  209.                     // Inicializa plataformas metálicas que van en diagonal
  210.                     plataforma_metal(214,1590,128,1443,2);
  211.                     plataforma_metal(108,1249,212,1249,1);
  212.                     plataforma_metal(212,1193,212,1056-58,2);
  213.                     plataforma_metal(108,1193,108,1056+64,1);
  214.                     plataforma_metal(158,582,158,624,5);
  215.  
  216.                     // Inicializa bola de pinchos
  217.                     bola_pin(157,1121);
  218.                     cadena(160,532,0,pi/24,pi/10);  // Inicializa cadena
  219.  
  220.                     // Inicializa protagonista
  221.                     jack(8,1971);
  222.  
  223.                     // Inicializa calabazas
  224.                     calabaza(100,1855,2);
  225.                     calabaza(100,1583,2);
  226.                     calabaza(233,1311,1);
  227.                     calabaza(219,313,2);
  228.                     calabaza(208,189,3);
  229.  
  230.                     // Inicializa cabezas que escupen
  231.                     cabeza(264,1894,1,24);
  232.                     cabeza(264,1515,1,96);
  233.                     cabeza(264,465,1,26);
  234.                     cabeza(56,1515,0,96);
  235.                     cabeza(56,1298,0,26);
  236.                     cabeza(264,792,1,26);
  237.                     cabeza(56,174,0,24);
  238.  
  239.                     // Inicializa arañas
  240.                     araña(74,1612,100);
  241.                     araña(245,955,274);
  242.                     araña(75,285,83);
  243.                     araña(245,23,71);
  244.  
  245.                     // Inicializa fantasmas
  246.                     voladores(320,4,158,1760,90,70,80,80);
  247.                     voladores(320,4,158,1145,140,110,80,80);
  248.                     voladores(320,4,158,616,48,64,80,120);
  249.                     voladores(320,4,158,190,64,96,90,110);
  250.  
  251.                     // Coge puntos de control para bonos
  252.                     FROM z=0 TO 25;
  253.                         get_point(1,1,z,&x,&y); // Coge puntos
  254.                         bono(x,y);              // Pone bonos
  255.                     END
  256.                 END
  257.  
  258.                 CASE 3:         // Inicializa fase tres
  259.                     // Carga fichero de gráficos para fase tres
  260.                     load_fpg("malvado\nivel3.fpg");
  261.  
  262.                     // Inicializa scroll para fase tres
  263.                     start_scroll(0,1,1,3,0,4);
  264.                     // Define la zona de scroll a partir de donde se mueve
  265.                     scroll.region1=define_region(1,160,100,1,1);
  266.  
  267.                     // Inicializa protagonista
  268.                     jack(64,0);
  269.  
  270.                     // Inicializa monstruo fin de fase (doctor malvado)
  271.                     malvado();              // Objeto monstruo
  272.                     energia_enemigo=16;     // Cantidad de energía
  273.                     // Identificador necesario por si pasas con truco
  274.                     id_barra_enemigo=barra_energia(); // Inicializa barra de energía
  275.                 END
  276.  
  277.             END
  278.  
  279.             fade_off();             // Apaga pantalla
  280.             clear_screen();         // Borra pantalla
  281.             fade_on();              // Enciende pantalla
  282.  
  283.             REPEAT                  // Bucle principal del juego
  284.                 IF (nivel==1)
  285.                     // Crea peces y burbujas decorativos
  286.                     SWITCH (rand(0,24))
  287.                         CASE 0: pez(rand(380,700),292); END
  288.                         CASE 1: pez(rand(1290,1354),288); END
  289.                         CASE 2: pez(rand(1848,1948),250); END
  290.                         CASE 3,4: burbuja(rand(3270,3300),70); END
  291.                     END
  292.                 END
  293.                 // Si se pulsa a la vez todas las letras que forman la
  294.                 // palabra div se pasa de fase
  295.                 IF (key(_d) AND key (_i) AND key(_v))
  296.                     fin_nivel=true;
  297.                 END
  298.                 FRAME;
  299.             // Repite hasta que se pase de nivel o te quedes sin vidas
  300.             UNTIL (fin_nivel OR vidas<0 OR key (_esc))
  301.             IF (key(_esc))
  302.                 saliendo=1;
  303.             END
  304.             IF (fin_nivel)        // Si se ha terminado la fase
  305.                 nivel++;          // Incrementa la fase
  306.                 fin_nivel=false;  // Inicializa la variable de control de fase
  307.             END
  308.             IF (vidas<0)
  309.                 write(fuente2,160,100,4,"GAME OVER");
  310.             END
  311.             IF (nivel==4)
  312.                 write(fuente2,160,100,4,"BIEN HECHO");
  313.             END
  314.  
  315.             FRAME(2400);             // Espera un segundo
  316.             fade_off();              // Apaga pantalla
  317.             stop_scroll(0);          // Para scroll
  318.             // Termina procesos de objetos que tapan gráficos
  319.             signal(TYPE objeto,s_kill);
  320.             // Termina procesos de objetos de primer plano
  321.             signal(TYPE primer_plano,s_kill);
  322.             // Para todos los sonidos
  323.             stop_sound(all_sound);
  324.             // Borra todos los textos que haya
  325.             delete_text(all_text);
  326.             // Descarga fichero de gráficos
  327.             unload_fpg(1);
  328.             // Quita la barra de energía del enemigo final
  329.             signal(id_barra_enemigo,s_kill);
  330.         // Repite hasta que no tengas vidas o llegue a la fase cuatro
  331.         UNTIL (vidas<0 OR nivel==4 OR key (_esc) OR saliendo)
  332.         saliendo=0;
  333.     END
  334. END
  335.  
  336. //-----------------------------------------------------------------------------
  337. // Proceso para el protagonista
  338. // Entradas: coordenadas horizontal (x) y vertical (y)
  339. //-----------------------------------------------------------------------------
  340.  
  341. PROCESS jack(x,y);
  342.  
  343. PRIVATE
  344.     incx=0;     // Variable para comprobar paredes
  345.     ultima_y=0; // Variable para mirar si sube
  346.     ultima_veloc=0;        // Variable para comprobar paredes
  347.     id2;        // Identificador de uso general
  348.  
  349. BEGIN
  350.     ctype=c_scroll;             // Mete dentro del scroll
  351.     scroll.camera=id;           // Hace que le siga la cámara
  352.     graph=100;
  353.     priority=1;
  354.  
  355.     LOOP
  356.         // Lee el teclado y el joystick
  357.         IF ((key(_right) OR joy.right) AND velocidad<8)
  358.             velocidad+=2;           // Sube velocidad a la derecha
  359.             flags=0;                // Mira a la derecha
  360.         ELSE
  361.             IF ((key(_left) OR joy.left) AND velocidad>-8)
  362.                 velocidad-=2;       // Sube velocidad a la izquierda
  363.                 flags=1;            // Mira a la izquierda
  364.             ELSE                    // Si no hay nada pulsado
  365.                 IF (velocidad>0)    // Frena a la derecha
  366.                     velocidad--;
  367.                 END
  368.                 IF (velocidad<0)    // O frena a la izquierda
  369.                     velocidad++;
  370.                 END
  371.             END
  372.         END
  373.  
  374.         // Mira si el protagonista choca con las paredes
  375.         ultima_veloc=velocidad;                // Guarda la velocidad en 'ultima_veloc'
  376.         IF (ultima_veloc<>0)                   // Y si se mueve
  377.             incx=ultima_veloc/abs(ultima_veloc);          // Halla la dirección
  378.             WHILE (ultima_veloc<>0)            // 'ultima_veloc' sirve de contador
  379.                 // Comprueba que no de por debajo
  380.                 IF (map_get_pixel(1,2,(x+incx)/2,(y-2)/2)<>120)
  381.                     // Ni que de por encima
  382.                     IF (map_get_pixel(1,2,(x+incx)/2,(y-32)/2)<>120)
  383.                         x+=incx;    // Y si no da, mueve al muñeco
  384.                     END
  385.                 END
  386.                 ultima_veloc-=incx;            // Resta 'ultima_veloc' hasta que sea cero
  387.             END
  388.         END
  389.  
  390.         // Si choca con una plataforma crea un nuevo protagonista
  391.         IF (id2=collision(TYPE plataforma))
  392.             // Tiene que estar bajando y por encima de la plataforma
  393.             IF (velocidad_gravedad>0 AND abs(x-id2.x)<50 AND y<=id2.y+24)
  394.                 jack_plataforma(x-id2.x,id2,50,8);
  395.             END
  396.         END
  397.  
  398.         // Si choca con una plataforma de metal crea un protagonista nuevo
  399.         IF (id2=collision(TYPE plataforma_metal))
  400.             // Tiene que estar bajando y por encima de la plataforma
  401.             IF (velocidad_gravedad>0 AND abs(x-id2.x)<36 AND y<=id2.y+12)
  402.                 jack_plataforma(x-id2.x,id2,36,-7);
  403.             END
  404.         END
  405.  
  406.         gravedad();             // Función para hallar la gravedad del protagonista
  407.  
  408.         IF (en_pantalla())      // Si el protagonista no baja
  409.             IF (velocidad<>0)   // Y se mueve
  410.                 graph++;        // Cambia de gráfico para animarlo
  411.                 IF (graph>106)
  412.                     graph=100;
  413.                 END
  414.             ELSE
  415.                 graph=101;      // Si no se mueve ponen el gráfico por defecto
  416.             END
  417.             // Lee que las teclas (Espacio y Control) o el joystick
  418.             IF (key(_space) OR key(_control) OR joy.button1)
  419.                 sound(s_salto2,100,rand(256,512));       // Si esta pulsado haz sonido
  420.                 velocidad_gravedad=-18;        // y salta
  421.             END
  422.         ELSE                    // Si el protagonista si baja
  423.             graph=108;          // Pon el gráfico de bajar
  424.         END
  425.  
  426.         IF (ultima_y<y)            // Comprueba si esta bajando
  427.             muerte=true;        // Si baja puede matar
  428.         ELSE
  429.             muerte=false;       // Si sube o esta quieto le pueden matan
  430.         END
  431.  
  432.         // Comprueba colisión con osos
  433.         IF (id2=collision(TYPE oso))
  434.             puntos+=350;
  435.         ELSE
  436.             // Comprueba colisión con abejas y fantasmas
  437.             IF (id2=collision(TYPE voladores))
  438.                 puntos+=575;
  439.             ELSE
  440.                 // Comprueba colisión con arañas
  441.                 IF (id2=collision(TYPE araña))
  442.                     puntos+=825;
  443.                 ELSE
  444.                     // Comprueba colisión con cabezas de monstruo
  445.                     IF (id2=collision(TYPE cabeza))
  446.                         puntos+=150;
  447.                     ELSE
  448.                         // Comprueba colisión con calabazas
  449.                         IF (id2=collision(TYPE calabaza))
  450.                             puntos+=425;
  451.                         END
  452.                     END
  453.                 END
  454.             END
  455.         END
  456.  
  457.         IF (id2)        // Comprueba si ha habido cualquier tipo de colisión
  458.             IF (muerte)     // Y si esta bajando y puede matar
  459.                 velocidad_gravedad=-12;     // Hace botar al protagonista
  460.                 estrellas(id2.x,id2.y);     // Crea estrellas vistosas
  461.                 signal(id2,s_kill);         // Elimina al monstruo que ha originado la colisión
  462.                 sound(s_burbuja,100,512);   // Y hace ruido de pompas
  463.             ELSE       // Si no puede matar, entonces el protagonista
  464.                 muerte_jack();              // Esta muerto
  465.             END
  466.         END
  467.  
  468.         // Si es fuego, directamente mata al protagonista
  469.         IF (collision(TYPE fuego)) muerte_jack(); END
  470.  
  471.         // Si son bolas, directamente mata al protagonista
  472.         IF (collision(TYPE bola)) muerte_jack(); END
  473.  
  474.         // Si es disparo de las cabezas, directamente mata al protagonista
  475.         IF (collision(TYPE disparo_cabeza)) muerte_jack(); END
  476.  
  477.         // Si es bola de pinchos, directamente mata al protagonista
  478.         IF (collision(TYPE bola_final)) muerte_jack(); END
  479.  
  480.         // Comprueba si hay colisión con los bonos
  481.         IF (id2=collision(TYPE bono))
  482.             sound(s_bonos,150,256);     // Haz sonido
  483.             bonos++;                    // Incrementa numero de bonos
  484.             puntos+=1000;               // Suma puntos
  485.             estrellas(id2.x,id2.y);     // Crea estrella vistosas
  486.             signal(id2,s_kill);         // Elimina los bonos de pantalla
  487.             IF (bonos>=10)              // Y si tiene mas de 10 bonos
  488.                 bonos-=10;              // Resta 10 bonos en la cuenta
  489.                 vidas++;                // Y suma una vida
  490.                 // Pone un mensaje de vida conseguida
  491.                 idtextovida=write(fuente1,160,150,4,"VIDA EXTRA");
  492.                 contadortextovida=0;
  493.                 contextovida=1;
  494.             END
  495.         END
  496.  
  497.         // Espera cuatro segundos hasta quitar el mensaje
  498.         IF (contextovida==1)
  499.             contadortextovida++;
  500.         END
  501.         IF (contadortextovida>99 AND contextovida==1)
  502.             delete_text(idtextovida);
  503.             contextovida=2;
  504.         END
  505.         // Actualiza las variables internas del scroll cero
  506.         move_scroll(0);
  507.  
  508.         IF (nivel==1)                   // En el nivel uno
  509.             IF (y>300)                  // Si ha pasado el borde inferior
  510.                 muerte_jack();          // Mata al protagonista
  511.             END
  512.             IF (x>3400)                 // Si ha llegado al extremo derecho
  513.                 // Si no ha acabado el nivel y no se ha creado el primer monstruo
  514.                 IF (not fin_nivel AND not get_id(TYPE hijo_malvado_cabeza))
  515.                     hijo_malvado();                     // Crea monstruo fin de fase
  516.                     energia_enemigo=16;                 // Crea barra de energía del monstruo
  517.                     id_barra_enemigo=barra_energia();   // Guarda identificador de la barra de
  518.                                                         // para quitarla si pasas fase con truco
  519.                 ELSE   // Si esta creado el monstruo
  520.                     // Comprueba si el protagonista a chocado
  521.                     IF (collision(TYPE hijo_malvado))
  522.                         muerte_jack();                  // Y si lo toca lo mata
  523.                     END
  524.                 END
  525.             END
  526.         ELSE
  527.             // Si estas en la fase dos y en la posición final
  528.             IF (nivel==2 AND x==58 AND y==53)
  529.                 fin_nivel=true;   // Acaba el nivel
  530.             END
  531.         END
  532.  
  533.         ultima_y=y;   // Guarda y en ultima_y para comprobar luego si baja
  534.         FRAME;
  535.     END
  536. END
  537.  
  538. //------------------------------------------------------------------------------
  539. // Proceso del protagonista cuando esta encima de una
  540. // plataforma para que el protagonista se mueva a la
  541. // vez que la plataforma.
  542. // Entradas: `xrelativa`         Posición relativa horizontal del
  543. //                               protagonista respecto al centro
  544. //                               de la plataforma
  545. //           `id2`               Identificador de la plataforma
  546. //           `tamaño_plataforma` Tamaño (largo) de la plataforma
  547. //           `incy`              Posición relativa vertical del
  548. //                               protagonista respecto al centro
  549. //                               al centro de la plataforma
  550. //-----------------------------------------------------------------------------
  551.  
  552. PROCESS jack_plataforma(xrelativa,id2,tamaño_plataforma,incy);
  553.  
  554. BEGIN
  555.  
  556.     // Duerme al proceso padre(El que le ha llamado)
  557.     // mientras esta este proceso activo
  558.     signal(father,s_sleep);
  559.     ctype=c_scroll;     // Hace que este dentro del scroll
  560.     graph=100;          // Pone el gráfico apropiado
  561.     flags=father.flags; // Coge las banderas (izq./der.) que tenia el padre
  562.     priority=1;         // Le da prioridad uno para que actualice
  563.                         // antes al protagonista que al scroll
  564.     scroll.camera=id;   // Hace que la cámara le siga
  565.  
  566.     LOOP
  567.         // Lee la tecla de la derecha y el joystick
  568.         IF ((key(_right) OR joy.right) AND velocidad<8)
  569.             velocidad+=2;       // Incrementa la velocidad a la derecha
  570.             flags=0;            // Lo pone mirando para la derecha
  571.         ELSE
  572.             IF ((key(_left) OR joy.left) AND velocidad>-8)
  573.                 velocidad-=2;       // Incrementa la velocidad a la izquierda
  574.                 flags=1;            // Lo pone mirando para la izquierda
  575.             ELSE                    // Si no se ha pulsado ninguna dirección
  576.                 IF (velocidad>0)
  577.                     velocidad--;    // Frena a la derecha
  578.                 END
  579.                 IF (velocidad<0)
  580.                     velocidad++;    // Frena a la izquierda
  581.                 END
  582.             END
  583.         END
  584.  
  585.         xrelativa+=velocidad;          // Suma velocidad a la posición relativa
  586.         x=xrelativa+id2.x;             // Convierte la posición relativa en real
  587.         y=id2.y+incy;
  588.  
  589.         IF (velocidad<>0)       // Si el muñeco se esta moviendo
  590.            graph++;             // Cambia el gráfico para animarlo
  591.            IF (graph>106)
  592.               graph=100;
  593.            END
  594.         ELSE
  595.             graph=101;          // Si no pon el gráfico de parado
  596.         END
  597.  
  598.         // Si se pulsa la tecla de salto (espacio o control o joystick)
  599.         IF (key(_space) OR key(_control) OR joy.button1)
  600.             signal(father,s_wakeup);                    // Despierta el proceso anterior (el padre)
  601.             father.x=x;                                 // Actualiza coordenada x
  602.             father.y=y;                                 // Actualiza coordenada y
  603.             father.velocidad=velocidad+id2.velocidad;   // Actualiza la velocidad
  604.             father.velocidad_gravedad=-18;              // Hace botar al protagonista
  605.             father.flags=flags;                         // Actualiza banderas (izq./der.)
  606.             sound(s_salto2,100,rand(256,512));          // Hace sonido de salto dos
  607.             scroll.camera=father;                       // Hace que la cámara le siga
  608.             signal(id,s_kill);                          // Elimina el proceso actual
  609.             FRAME;
  610.         END
  611.  
  612.         // Si el protagonista esta fuera de la plataforma
  613.         IF (abs(x-id2.x)>=tamaño_plataforma+4)
  614.             signal(father,s_wakeup);                    // Despierta el proceso anterior
  615.             father.x=x;                                 // Actualiza x
  616.             father.y=y;                                 // Actualiza y
  617.             father.velocidad=velocidad+id2.velocidad;   // Actualiza velocidad
  618.             father.flags=flags;                         // Actualiza banderas (izq./der.)
  619.             father.velocidad_gravedad=0;                // Deja al protagonista suspendido en el aire
  620.             scroll.camera=father;                       // hace que la cámara le siga
  621.             signal(id,s_kill);                          // Elimina el proceso actual
  622.             FRAME;
  623.         END
  624.  
  625.         // Comprueba si ha tocado las abejas o los fantasmas
  626.         IF (collision(TYPE voladores))
  627.             signal(father,s_kill);      // Elimina el proceso anterior
  628.             muerte_jack();              // Mata al protagonista
  629.         END
  630.  
  631.         // Comprueba si ha tocado con el primer monstruo
  632.         IF (collision(TYPE hijo_malvado))
  633.             signal(father,s_kill);      // Elimina el proceso anterior
  634.             muerte_jack();              // Mata al protagonista
  635.         END
  636.  
  637.         // Comprueba si ha tocado con el disparo que lanzan las cabezas
  638.         IF (collision(TYPE disparo_cabeza))
  639.             signal(father,s_kill);      // Elimina el proceso anterior
  640.             muerte_jack();              // Mata al protagonista
  641.         END
  642.  
  643.         // Comprueba si le ha tocado la bola de pinchos
  644.         IF (collision(TYPE bola_final))
  645.             signal(father,s_kill);      // Elimina el proceso anterior
  646.             muerte_jack();              // Mata al protagonista
  647.          END
  648.  
  649.         // Actualiza las coordenadas internas del scroll
  650.         move_scroll(0);
  651.         FRAME;
  652.     END
  653.  
  654. END
  655.  
  656. //-----------------------------------------------------------------------------
  657. // Proceso para hacer la muerte del muñeco
  658. //-----------------------------------------------------------------------------
  659.  
  660. PROCESS muerte_jack()
  661.  
  662. PRIVATE
  663.     incr_y=-12;                          // Variable para mover gráfico poco a poco
  664.  
  665. BEGIN
  666.     ctype=c_scroll;                      // Lo mete dentro del scroll
  667.     graph=116;                           // Pone el gráfico apropiado
  668.     priority=1;                          // Le da prioridad máxima
  669.     signal(father,s_sleep);              // Duerme al proceso padre (el del protagonista)
  670.     x=father.x;                          // Coge x del protagonista (proceso padre)
  671.     y=father.y;                          // Coge y
  672.  
  673.     // Si esta en el nivel uno
  674.     IF (nivel==1)
  675.         scroll.camera=id;                // Hace que la cámara le siga
  676.     END
  677.     y-=12;                               // Mueve el gráfico hacia abajo
  678.  
  679.     REPEAT
  680.         y+=incr_y;                           // Sigue bajando el gráfico
  681.         incr_y++;                            // Cada vez mas despacio
  682.         angle+=pi/16;                    // A la vez se gira
  683.         size+=4;                         // Y se re-escala
  684.         FRAME;
  685.     UNTIL (out_region(id,0));              // Mientras o salga de pantalla
  686.     // Apaga pantalla si le quedan vidas
  687.     IF (vidas>0)
  688.         fade_off();
  689.     ELSE
  690.         idprincipal.x=father.x;
  691.         idprincipal.y=father.y;
  692.         scroll.camera=idprincipal;
  693.     END
  694.     vidas--;
  695.     IF (vidas>-1)                       // Si no quedan vidas
  696.         SWITCH (nivel)                  // Dependiendo de la fase
  697.             CASE 1:
  698.  
  699.                 SWITCH(father.x)         // Y donde se haya quedado
  700.                     CASE 0..799:         // crea un nuevo protagonista
  701.                         jack(8,0);       // en la posición adecuada
  702.                     END
  703.                     CASE 800..1959:
  704.                         jack(800,0);
  705.                     END
  706.                     CASE 1960..2531:
  707.                         jack(1960,0);
  708.                     END
  709.                     CASE 2532..3283:
  710.                         jack(2532,0);
  711.                     END
  712.                     DEFAULT:
  713.                         jack(3284,0);
  714.                     END
  715.                 END
  716.             END
  717.             CASE 2:
  718.                 SWITCH(father.y)
  719.                     CASE 0..390:
  720.                         jack(203,422);
  721.                     END
  722.                     CASE 391..950:
  723.                         jack(68,921);
  724.                     END
  725.                     CASE 951..1400:
  726.                         jack(72,1392);
  727.                     END
  728.                     CASE 1401..2000:
  729.                         jack(8,1971);
  730.                     END
  731.                 END
  732.             END
  733.         END
  734.         signal(father,s_kill);          // Elimina el protagonista anterior
  735.         //enciende pantalla
  736.         fade_on();
  737.     ELSE
  738.         signal(TYPE barra_energia,s_kill_tree); // Elimina la barra de final de
  739.     END                                         // fase si hace falta.
  740.  
  741. END
  742.  
  743. //-----------------------------------------------------------------------------
  744. // Proceso para la muerte del muñeco especial para la pantalla
  745. // del monstruo final con las bombas
  746. //-----------------------------------------------------------------------------
  747.  
  748. PROCESS muerte_jack2();
  749.  
  750. PRIVATE
  751.     id2;                      // Identificador para protagonista anterior
  752.     incr_y=-12;               // Variable para bajar gráfico poco a poco
  753.  
  754.  
  755. BEGIN
  756.  
  757.     ctype=c_scroll;           // Integra el gráfico en el scroll
  758.     graph=116;                // Coge el gráfico de muerto
  759.     id2=get_id(TYPE jack);    // Coge identificador de protagonista
  760.     signal(id2,s_sleep);      // Y duérmelo.
  761.     x=id2.x;                  // Coge la x del protagonista
  762.     y=id2.y-12;               // Coge la y pero un poco mas abajo
  763.  
  764.     REPEAT
  765.         y+=incr_y;                // Mueve gráfico hacia abajo
  766.         incr_y++;                 // Cada vez mas lento
  767.         angle+=pi/16;         // Rotación del gráfico
  768.         size+=4;              // Y re-escalado
  769.         FRAME;
  770.     UNTIL (out_region(id,0))    // Hasta que se salga de pantalla
  771.     // Apaga pantalla si le quedan vidas
  772.     IF (vidas>0)
  773.         fade_off();
  774.     ELSE
  775.         idprincipal.x=father.x;
  776.         idprincipal.y=father.y;
  777.         scroll.camera=idprincipal;
  778.     END
  779.     vidas--;                  // Quita una vida
  780.     IF (vidas>-1)             // Y si todavía tienes vidas
  781.         fade_on();            // Encienda la pantalla
  782.         jack(320,0);          // Crea un nuevo protagonista
  783.         signal(id2,s_kill);   // Y elimina el anterior
  784.     ELSE
  785.         signal(TYPE barra_energia,s_kill_tree); // Si se acaba el juego
  786.     END                                         // quita la barra del enemigo final
  787. END
  788.  
  789. //-----------------------------------------------------------------------------
  790. // Proceso para calcular los suelos y la gravedad de muñeco
  791. //-----------------------------------------------------------------------------
  792.  
  793. PROCESS gravedad();
  794.  
  795. PRIVATE
  796.     vgravedad;        // Variable para guardar temporalmente la gravedad
  797.  
  798. BEGIN
  799.     // Coge la coordenada y a partir de la gravedad del protagonista (padre)
  800.     vgravedad=(father.velocidad_gravedad+=2);   // Pero incrementada en 2
  801.     IF (vgravedad>16)                           // Si es mayor de 16
  802.         father.velocidad_gravedad=16;           // Haz que sea 16 la gravedad del protagonista
  803.         vgravedad=16;                           // Y también la variable temporal
  804.     END
  805.  
  806.     IF (vgravedad<0)                        // Si la gravedad es negativa
  807.         WHILE (vgravedad++!=0)              // Mientras no sea cero, la incrementa
  808.             // Si no se da con el techo
  809.             IF (map_get_pixel(1,2,father.x/2,(father.y-24)/2)<>252)
  810.                 father.y--;                 // Haz que el protagonista suba
  811.             ELSE                            // Si no pon la gravedad a cero
  812.                 father.velocidad_gravedad=0;
  813.                 BREAK;
  814.             END
  815.         END
  816.     ELSE                                    // Si la gravedad es cero o positiva
  817.         father.y+=vgravedad;                // Se suma a la coordenada del protagonista
  818.         // Comprueba el rango vertical del movimiento del protagonista
  819.         FROM vgravedad=-16 TO 7 STEP 2;     // Acaba el proceso si se toca el suelo
  820.             IF (map_get_pixel(1,2,father.x/2,(father.y+vgravedad)/2)==136)
  821.                 BREAK;                      // Sal si se encuentra con el suelo
  822.             END
  823.         END
  824.         IF (vgravedad<8)                    // Si se encuentra con el suelo
  825.             father.y+=vgravedad;            // Se actualiza con el máximo que se pueda mover
  826.             father.velocidad_gravedad=0;    // Y se pone la gravedad a 0
  827.         END
  828.     END
  829.  
  830. END
  831.  
  832. //-----------------------------------------------------------------------------
  833. // Proceso para comprobar si se toca suelo
  834. // Salidas: True/False, según si se toca suelo o no
  835. //-----------------------------------------------------------------------------
  836.  
  837. PROCESS en_pantalla()
  838.  
  839. BEGIN
  840.  
  841.     IF (map_get_pixel(1,2,father.x/2,father.y/2)==136)
  842.         RETURN(TRUE);   // Si se toca suelo el proceso devuelve true
  843.     ELSE
  844.         RETURN(FALSE);  // Si no, devuelve false
  845.     END
  846.  
  847. END
  848.  
  849. //-----------------------------------------------------------------------------
  850. // Proceso para los objetos de primer plano
  851. // Entradas: 'graph'        numero de gráfico
  852. //           'xrelativa'    posición horizontal relativa (x) del
  853. //                          gráfico respecto al scroll
  854. //-----------------------------------------------------------------------------
  855.  
  856. PROCESS primer_plano(graph,xrelativa);
  857.  
  858. BEGIN
  859.     file=1;
  860.     LOOP
  861.         y=400-scroll.y0*2;
  862.         x=(xrelativa-scroll.x0)*2;  // Halla la posición relativa al scroll
  863.         FRAME;
  864.     END
  865. END
  866.  
  867. //-----------------------------------------------------------------------------
  868. // Proceso para poner los objetos que tapan otros
  869. // Entradas: 'file'  fichero de gráficos que se usa
  870. //           'graph' numero de gráfico
  871. //           'x' 'y' Coordenadas 'x' e 'y' del gráfico
  872. //           'z'     Profundidad del gráfico en pantalla
  873. //           'ctype' Variable para ver si esta dentro del scroll
  874. //-----------------------------------------------------------------------------
  875.  
  876. PROCESS objeto(file,graph,x,y,z,ctype);
  877.  
  878. BEGIN
  879.     LOOP
  880.         FRAME;
  881.     END
  882. END
  883.  
  884. //-----------------------------------------------------------------------------
  885. // Proceso para poner los objetos de los bonos
  886. // Entradas: 'x' 'y' Coordenadas de los objetos
  887. //-----------------------------------------------------------------------------
  888.  
  889. PROCESS bono(x,y);
  890.  
  891. BEGIN
  892.     ctype=c_scroll;         // Haz que este dentro del scroll
  893.     graph=216;              // Pon el gráfico inicial del gráfico
  894.  
  895.     LOOP                    // Realiza la animación de los gráficos
  896.         graph++;
  897.         IF (graph>220)
  898.             graph=216;
  899.         END
  900.         FRAME;
  901.     END
  902. END
  903.  
  904. //-----------------------------------------------------------------------------
  905. // Proceso para poner los objetos de las estrellas
  906. // Entradas: 'x' 'y' Coordenadas de inicio de las estrellas
  907. //-----------------------------------------------------------------------------
  908.  
  909. PROCESS estrellas(x,y);
  910.  
  911. PRIVATE
  912.     incr_x;                    // Incremento horizontal
  913.     n_estrellas;               // Numero de estrellas (contador)
  914.  
  915. BEGIN
  916.     ctype=c_scroll;            // Haz que este dentro del scroll
  917.     graph=200;                 // Pon el gráfico inicial de la estrella
  918.  
  919.     FROM n_estrellas=0 TO 11;            // Crea 12 estrellas iguales
  920.         CLONE
  921.             BREAK;
  922.         END
  923.     END
  924.  
  925.     incr_x=rand(-6,6);                      // Elige al azar el incremento horizontal
  926.     velocidad_gravedad=rand(-24,-8);    // Y también el vertical
  927.     n_estrellas=32;
  928.  
  929.     WHILE (n_estrellas-->0);          // Mientras queden estrellas (n_estrellas = numero de estrellas)
  930.         // Realiza la animación de los gráficos
  931.         graph++;
  932.         IF (graph>204) graph=200; END
  933.         x+=incr_x;                      // Mueve las estrellas horizontalmente
  934.         y+=velocidad_gravedad;      // Y verticalmente
  935.         velocidad_gravedad+=2;      // Y reduce el incremento vertical (gravedad)
  936.         FRAME;
  937.     END
  938.  
  939. END
  940.  
  941. //-----------------------------------------------------------------------------
  942. // Proceso para poner los objetos de los osos
  943. // Entradas:  'x' 'y' Coordenadas x e y de objeto
  944. //            'incr_x'    Incremento horizontal (a der. e izq.
  945. //-----------------------------------------------------------------------------
  946.  
  947. PROCESS oso(x,y,incr_x);
  948.  
  949. BEGIN
  950.     graph=300;      // Número de gráfico
  951.     ctype=c_scroll; // Lo mete dentro del scroll
  952.     LOOP
  953.  
  954.         // Haz un sonido de oso de vez en cuando (rand)
  955.         IF (rand(0,48)==0) suena_sonido(s_oso,50,256); END
  956.         x+=incr_x;             // Mueve el gráfico horizontalmente
  957.  
  958.         // Si ha llegado al final de la plataforma
  959.         IF (NOT en_pantalla())
  960.             incr_x=-incr_x;        // Cambia el incremento horizontal
  961.             x+=incr_x*2;       // Mueve un poco el gráfico
  962.             // Da la vuelta al gráfico
  963.             IF (flags==0)
  964.                 flags=1;
  965.             ELSE
  966.                 flags=0;
  967.             END
  968.         END
  969.  
  970.         // Realiza la animación de los gráficos
  971.         graph++;
  972.             IF (graph>304) graph=300; END
  973.         FRAME;
  974.     END
  975. END
  976.  
  977. //-----------------------------------------------------------------------------
  978. // Proceso para poner los objetos de las calabazas
  979. // Entradas: 'x'        Coordenada x del objeto
  980. //           'ultima_y' Coordenada y del objeto especial
  981. //           'incr_x'       Incremento horizontal (dirección izq/der)
  982. //-----------------------------------------------------------------------------
  983.  
  984. PROCESS calabaza(x,ultima_y,incr_x);
  985.  
  986. PRIVATE
  987.     anim;                   // Hace que la animación sea intermitente
  988.     salto=-5;               // Variable para procesar los saltos de la calabaza
  989.     y_temp;                 // Variable temporal de y
  990.  
  991. BEGIN
  992.     graph=340;              // Selecciona el gráfico inicial
  993.     ctype=c_scroll;         // Introduce el objeto dentro del scroll
  994.     y=ultima_y;             // Carga 'y' con la entrada de proceso ('y' especial)
  995.  
  996.     LOOP
  997.         // Haz sonido del oso de vez en cuando (rand)
  998.         IF (rand(0,48)==0) suena_sonido(s_oso,30,512); END
  999.         x+=incr_x;              // Mueve al gráfico horizontalmente
  1000.         y_temp=y;           // Guarda temporalmente 'y' para comprobar plataformas
  1001.         y=ultima_y;            // Y lo carga con la 'y' inicial
  1002.  
  1003.         // Si sale fuera de la plataforma donde este
  1004.         IF (NOT en_pantalla())
  1005.             incr_x=-incr_x;         // Cambia la dirección
  1006.             x+=incr_x*2;        // Muévelo un poco
  1007.         END
  1008.  
  1009.         y=y_temp;           // Recupera la 'y' actualizada
  1010.         y+=salto;           // Suma a 'y' el salto
  1011.         salto++;            // Incrementa 'y' para mover el gráfico
  1012.         IF (salto==6)       // Comprueba si se ha llegado al limite
  1013.             salto=-5;       // Para empezar otra vez
  1014.         END
  1015.  
  1016.  
  1017.         IF (anim)           // Comprueba si toca animar al gráfico
  1018.             graph++;        // Animación de gráficos
  1019.             IF (graph>344)
  1020.                 graph=340;
  1021.             END
  1022.         END
  1023.  
  1024.         anim=NOT anim;      // Hace que la animación sea mas lenta
  1025.         FRAME;
  1026.     END
  1027. END
  1028.  
  1029. //-----------------------------------------------------------------------------
  1030. // Proceso para objetos de cabezas que escupen
  1031. // Entradas: 'x' 'y'  Coordenadas del gráfico
  1032. //           'flags'  Dirección hacia donde mira el gráfico
  1033. //           'pausa'  Numero de frames que esta en pausa
  1034. //-----------------------------------------------------------------------------
  1035.  
  1036. PROCESS cabeza(x,y,flags,pausa);
  1037.  
  1038. BEGIN
  1039.     ctype=c_scroll;                 // Haz que este dentro del scroll
  1040.     z=2;                            // Pon al gráfico por delante de otros
  1041.  
  1042.     LOOP
  1043.         graph=350;                  // Elige el gráfico inicial
  1044.         FRAME(pausa*100);           // Espera los frames indicados por pausa
  1045.  
  1046.         WHILE (graph<355)           // Anímalo hasta que se llegue al limite
  1047.             graph++;
  1048.             FRAME(200);             // Espera dos frames
  1049.         END
  1050.  
  1051.         // Haz sonido de lanzamiento de gotas horizontales
  1052.         suena_sonido(s_toque,20,768);
  1053.         // Haz que lance gotas horizontales
  1054.         disparo_cabeza(x+20-flags*40,y,4-flags*8,flags);
  1055.     END
  1056.  
  1057. END
  1058.  
  1059. //-----------------------------------------------------------------------------
  1060. // Proceso para lanzamiento de gotas horizontales
  1061. // Entradas: 'x' 'y' Coordenadas del objeto
  1062. //           'incx'  Incremento horizontal (dirección)
  1063. //           'flags' Posición hacia la que mira el gráfico
  1064. //                   horizontalmente
  1065. //-----------------------------------------------------------------------------
  1066.  
  1067. PROCESS disparo_cabeza(x,y,incx,flags);
  1068.  
  1069. BEGIN
  1070.     ctype=c_scroll;               // Hace que este dentro del scroll
  1071.     graph=356;                    // Elige el gráfico apropiado
  1072.  
  1073.     REPEAT
  1074.         x+=incx;                  // Muévelo horizontalmente
  1075.         FRAME;
  1076.     UNTIL (out_region(id,0))      // Hasta que salga de pantalla
  1077.  
  1078. END
  1079.  
  1080. //-----------------------------------------------------------------------------
  1081. // Proceso para objetos de los abejorros y fantasmas
  1082. // Entradas:  'gr'            Tipo de gráfico (abejorro/fantasma)
  1083. //            'flags'         Tipo de transparencia
  1084. //            'xrelativa'     Posición x de referencia
  1085. //            'yrelativa'     Posición y de referencia
  1086. //            'incx' 'incy'   Frecuencia de giro en los dos ejes
  1087. //            'distx' 'disty' Distancia del giro en los ejes
  1088. //-----------------------------------------------------------------------------
  1089.  
  1090. PROCESS voladores(gr,flags,xrelativa,yrelativa,incx,incy,distx,disty);
  1091.  
  1092. PRIVATE
  1093.     angulo3;
  1094.     id2;
  1095.  
  1096. BEGIN
  1097.     graph=gr;            // Elige el gráfico inicial apropiado
  1098.     ctype=c_scroll;      // haz que este dentro del scroll
  1099.  
  1100.     LOOP
  1101.         // Haz un sonido de vez en cuando
  1102.         IF (rand(0,48)==0)
  1103.             // Sonido de fantasmas
  1104.             IF (flags==4)
  1105.                 suena_sonido(s_fantasma,50,256);
  1106.             // Sonido de abejorros
  1107.             ELSE
  1108.                 suena_sonido(s_abeja,150,256);
  1109.             END
  1110.         END
  1111.  
  1112.         angulo2+=pi/incx;                 // Halla el tamaño de los incrementos
  1113.         angulo3+=pi/incy;                 // que se harán en las dos coordenadas
  1114.         x=xrelativa+get_distx(angulo2,distx);    // Incrementa la coordenada x
  1115.         y=yrelativa+get_disty(angulo3,disty);    // Incrementa la coordenada y
  1116.  
  1117.         // Realiza la animación de los gráficos
  1118.         graph++;
  1119.         IF (graph==gr+6)
  1120.             graph=gr;
  1121.         END
  1122.         FRAME;
  1123.     END
  1124. END
  1125.  
  1126. //-----------------------------------------------------------------------------
  1127. // Proceso para los objetos de tipo burbuja
  1128. // Entradas: 'x' 'y' Coordenadas del objeto en pantalla
  1129. //-----------------------------------------------------------------------------
  1130.  
  1131. PROCESS burbuja(x,y);
  1132.  
  1133. BEGIN
  1134.     z=64;                // Pone los gráficos un poco detrás
  1135.                          // para así poder taparlos con la olla
  1136.     graph=430;           // Elige el gráfico apropiado
  1137.     ctype=c_scroll;      // Pon el objeto dentro del scroll
  1138.     WHILE (size>0)       // Mientras el tamaño(re-escalado) sea mayor que cero
  1139.         y-=2;            // Mueve el objeto hacia arriba
  1140.         size-=2;         // Y reduce su tamaño.
  1141.         FRAME;
  1142.     END
  1143. END
  1144.  
  1145. //-----------------------------------------------------------------------------
  1146. // Proceso para objetos tipo pez.
  1147. // Entradas:  'x'  Coordenada horizontal del gráfico
  1148. //            'yrelativa' Coordenada vertical especial del gráfico
  1149. //-----------------------------------------------------------------------------
  1150.  
  1151. PROCESS pez(x,yrelativa);
  1152.  
  1153. PRIVATE
  1154.     incr_y;                 // Incremento vertical del gráfico
  1155.  
  1156. BEGIN
  1157.     z=-10;
  1158.     chapuzon(x,yrelativa);  // Pone un chapuzón de agua
  1159.     graph=410;              // Coge el gráfico inicial del pez
  1160.     ctype=c_scroll;         // Pone al objeto dentro del scroll
  1161.     y=yrelativa;            // Actualiza y con la entrada del proceso
  1162.     incr_y=-12;             // Inicializa el incremento (hacia arriba)
  1163.     // Haz sonido para peces
  1164.     suena_sonido(s_pez,25,512);
  1165.  
  1166.     // Mientras no se llegue al limite de movimiento
  1167.     WHILE (incr_y<12)
  1168.         // Realiza la animación del gráfico, mientras se este moviendo (incr_y<>0)
  1169.         IF (incr_y AND graph<416)
  1170.             graph++;
  1171.         END
  1172.         y+=incr_y;          // Mueve al gráfico verticalmente
  1173.         incr_y++;           // Actualiza el incremento vertical
  1174.         FRAME;
  1175.     END
  1176.     chapuzon(x,yrelativa);  // Pone un chapuzón de agua
  1177. END
  1178.  
  1179. //-----------------------------------------------------------------------------
  1180. // Proceso para reproducir sonidos
  1181. // Entradas: 'x'          Identificador del sonido
  1182. //           'volumen'    Volumen del sonido
  1183. //           'frecuencia' Frecuencia del sonido
  1184. //-----------------------------------------------------------------------------
  1185.  
  1186. PROCESS suena_sonido(x,volumen,frecuencia);
  1187.  
  1188. BEGIN
  1189.     // Si el gráfico esta dentro de la pantalla realiza el sonido
  1190.     IF (NOT (out_region(father,0)))
  1191.         sound(x,volumen,frecuencia);
  1192.     END
  1193. END
  1194.  
  1195. //------------------------------------------------------------------------------
  1196. // Proceso para poner objetos de chapuzón de agua
  1197. // Entradas: 'x' 'y' Coordenadas del objeto
  1198. //------------------------------------------------------------------------------
  1199.  
  1200. PROCESS chapuzon(x,y);
  1201.  
  1202. BEGIN
  1203.     ctype=c_scroll;     // Pon el objeto dentro del scroll
  1204.     // Realiza la animación de los gráficos
  1205.     FROM graph=400 TO 405;
  1206.         FRAME(200);     // Espera dos frames
  1207.     END
  1208. END
  1209.  
  1210. //-----------------------------------------------------------------------------
  1211. // Proceso para poner los objetos araña
  1212. // Entradas: 'x' 'y'  Coordenadas del objeto
  1213. //           'height' Altura del objeto
  1214. //-----------------------------------------------------------------------------
  1215.  
  1216. PROCESS araña(x,y,height);
  1217.  
  1218. PRIVATE
  1219.     contador;                             // Contador de uso general
  1220.  
  1221. BEGIN
  1222.     z=-11;
  1223.     ctype=c_scroll;                // Hace que este dentro del scroll
  1224.     graph=330;                     // Elige el gráfico inicial
  1225.     height=(height/4)*4;           // Hace height múltiplo de cuatro
  1226.  
  1227.     LOOP
  1228.         FROM contador=0 TO 47;
  1229.             // Realiza la animación de la araña de vez en cuando (rand)
  1230.             IF (rand(0,10)==0)
  1231.                 graph++;
  1232.                 IF (graph>335) graph=330; END
  1233.             END
  1234.             FRAME;
  1235.         END
  1236.  
  1237.         // Haz el sonido de la araña
  1238.         suena_sonido(s_araña,200,256);
  1239.         // Baja el objeto de 4 en 4 con el gráfico inmóvil
  1240.         FOR (contador=0;contador<height;contador+=4);
  1241.             y+=4;
  1242.             FRAME;
  1243.         END
  1244.  
  1245.         // Sube el objeto de 1 en 1 con animación de gráficos
  1246.         FOR (contador=0;contador<height;contador++);
  1247.             y--;
  1248.             ++graph;
  1249.             IF (graph>335)
  1250.                 graph=330;
  1251.             END
  1252.             FRAME;
  1253.         END
  1254.     END
  1255. END
  1256.  
  1257. //-----------------------------------------------------------------------------
  1258. // Proceso para los objetos de las cadenas
  1259. // Entradas: 'x' 'y' Coordenadas del objeto
  1260. //           'ang'   Angulo inicial del objeto
  1261. //           'iang'  Velocidad de incremento dentro del ángulo
  1262. //           'foco'  Tamaño total de ángulo (min-max)
  1263. //-----------------------------------------------------------------------------
  1264.  
  1265. PROCESS cadena(x,y,ang,iang,foco);
  1266.  
  1267. BEGIN
  1268.     priority=10;      // Pone un poco menos de prioridad que la plataforma
  1269.     ctype=c_scroll;   // Pone el gráfico dentro del scroll
  1270.     file=1;           // Escoge el fichero de gráficos 1
  1271.     graph=14;         // Coge el gráfico de la cadena
  1272.     z=20;             // Pone el gráfico por detrás de la plataforma
  1273.     plataforma();     // Crea una plataforma
  1274.  
  1275.     LOOP
  1276.         ang+=iang;    // Incrementa el ángulo
  1277.         // Coge el ángulo del coseno para hacer movimiento pendular con distintas velocidades
  1278.         angle=get_distx(ang,foco);
  1279.         FRAME;
  1280.     END
  1281.  
  1282. END
  1283.  
  1284. //-----------------------------------------------------------------------------
  1285. // Proceso para objetos plataformas
  1286. //-----------------------------------------------------------------------------
  1287.  
  1288. PROCESS plataforma()
  1289.  
  1290. BEGIN
  1291.     priority=9;         // Pone mas prioridad que a la cadena
  1292.     ctype=c_scroll;     // Pone el objeto dentro del scroll
  1293.     file=1;             // Usa el fichero de gráficos 1
  1294.     graph=15;           // Coge el gráfico de la plataforma
  1295.     z=19;               // Pone el gráfico por encima de la cadena
  1296.  
  1297.     LOOP
  1298.         // Coge las coordenadas de la plataforma respecto a la cadena
  1299.         velocidad=father.x+get_distx(father.angle-pi/2,130)-x;
  1300.         x+=velocidad;
  1301.         y=father.y+get_disty(father.angle-pi/2,130);
  1302.         FRAME;
  1303.     END
  1304.  
  1305. END
  1306.  
  1307. //-----------------------------------------------------------------------------
  1308. // Proceso para objetos de plataformas metálicas
  1309. // Entradas: 'x1' 'y1' Coordenadas iniciales de la plataforma
  1310. //           'x2' 'y2' Coordenadas finales de la plataforma
  1311. //           'ipaso'   Incremento (velocidad) en %
  1312. //-----------------------------------------------------------------------------
  1313.  
  1314. PROCESS plataforma_metal(x1,y1,x2,y2,ipaso);
  1315.  
  1316. PRIVATE
  1317.     paso;            // Contador de proceso de movimiento (indica por donde va)
  1318.  
  1319. BEGIN
  1320.     priority=10;     // Le da una prioridad baja
  1321.     ctype=c_scroll;  // Pone el gráfico en el scroll
  1322.     file=1;          // Elige el fichero de gráficos uno
  1323.     graph=16;        // Elige el gráfico de la plataforma metálica
  1324.     x=x1;            // Introduce las coordenadas iniciales
  1325.     y=y1;
  1326.  
  1327.     LOOP
  1328.         // Actualiza las nuevas coordenadas
  1329.         x=(x1*paso+x2*(100-paso))/100;
  1330.         y=(y1*paso+y2*(100-paso))/100;
  1331.         // Suma el incremento necesario
  1332.         paso+=ipaso;
  1333.         // Si se ha llegado al cien por cien
  1334.         IF (paso MOD 100==0)
  1335.             ipaso=-ipaso;              // Cambia la dirección
  1336.             suena_sonido(s_estrella,12,512);  // Haz sonido de estrellas
  1337.         END
  1338.     FRAME;
  1339.     END
  1340.  
  1341. END
  1342.  
  1343. //-----------------------------------------------------------------------------
  1344. // Proceso para el objeto del monstruo de la primera fase
  1345. //-----------------------------------------------------------------------------
  1346.  
  1347. PROCESS hijo_malvado();
  1348.  
  1349. PRIVATE
  1350.     contador;                             // Contador de carácter general
  1351.     regionx=96;                    // Necesario para centrar la pantalla
  1352.  
  1353. BEGIN
  1354.     file=1;                        // Elige el primer fichero de gráficos
  1355.     ctype=c_scroll;                // Introduce el gráfico dentro del scroll
  1356.     x=3800;                        // Coge coordenadas
  1357.     y=261;
  1358.     z=8;                           // Elige la profundidad (detrás)
  1359.     graph=104;                     // Elige el gráfico inicial
  1360.     hijo_malvado_cabeza();         // Crea la cabeza del monstruo
  1361.  
  1362.     // Modifica la región de movimiento de scroll
  1363.     // para centrarla, con el muñeco, en el centro de la pantalla
  1364.     WHILE (regionx<160); // La modifica poco a poco (suavemente)
  1365.         define_region(1,++regionx,100,1,1);
  1366.         FRAME;
  1367.     END
  1368.  
  1369.     LOOP
  1370.         graph=104;                  // Elige gráfico inicial
  1371.         flags=0;                    // Sin ningún tipo de espejo
  1372.         FRAME(5000);                // Pon el gráfico y espera 50 frames (un segundo)
  1373.         graph=105;                  // Pone el gráfico de lanzando bola
  1374.         FRAME(400);                 // Imprime y espera 4 frames
  1375.         graph=106;                  // Pone el gráfico de ya haber lanzado bola
  1376.         bola(x-16,y-30,-6);         // Crea bola de fuego
  1377.         FRAME(400);                 // Espera 4 frames
  1378.         graph=105;                  // Pone el gráfico como recogiéndose
  1379.         FRAME(400);                 // Espera 4 frames
  1380.         graph=104;                  // Pone el gráfico inicial
  1381.         FRAME(5000);                // Espera 50 frames
  1382.         graph=107;                  // Pone el gráfico para saltar
  1383.         // Mueve el gráfico (salta)
  1384.         FROM contador=-16 TO 16;
  1385.             y+=contador;
  1386.             x-=10;
  1387.             FRAME;
  1388.         END
  1389.         // Haz sonido de toque
  1390.         sound(s_toque,150,256);
  1391.         graph=104;                 // Gráfico inicial
  1392.         flags=1;                   // Hace espejo para que mire el protagonista
  1393.         FRAME(5000);               // Repite el proceso de arriba
  1394.         graph=105;
  1395.         FRAME(400);
  1396.         graph=106;
  1397.         bola(x+16,y-30,6);
  1398.         FRAME(400);
  1399.         graph=105;
  1400.         FRAME(400);
  1401.         graph=104;
  1402.         FRAME(5000);
  1403.         graph=107;
  1404.         FROM contador=-16 TO 16;
  1405.             y+=contador;
  1406.             x+=10;
  1407.             FRAME;
  1408.         END
  1409.         // Realizada sonido de toque
  1410.         sound(s_toque,150,256);
  1411.     END
  1412. END
  1413.  
  1414. //-----------------------------------------------------------------------------
  1415. // Proceso para objeto de cabeza de monstruo primera fase
  1416. //-----------------------------------------------------------------------------
  1417.  
  1418. PROCESS hijo_malvado_cabeza();
  1419.  
  1420. PRIVATE
  1421.     ángulo0;                               // Variable para mover la cabeza en forma de elipse
  1422.     id2;                               // Identificador del protagonista y del cuerpo al final (monstruo muerto)
  1423.     // Crea una cadena de variables de 50 posiciones para la animación de los gráficos
  1424.     anim[]=40 DUP (100),101,101,102,102,103,103,102,102,101,101;
  1425.     ianim;                             // Contador dentro de la cadena de animación
  1426.     incy=0;                            // Variable para bajar y subir la cabeza
  1427.                                        // cuando el protagonista la toca y quita el cuerpo
  1428.                                        // cuando se acaba la fase
  1429. BEGIN
  1430.     file=1;                            // Elige el fichero de gráficos 1
  1431.     graph=100;                         // Pone el gráfico inicial
  1432.     ctype=c_scroll;                    // Pone el gráfico dentro del scroll
  1433.     z=4;                               // Profundidad por delante del cuerpo pero detrás del protagonista
  1434.     REPEAT
  1435.         // Pone la cabeza al revés del cuerpo para colocarla
  1436.         IF (father.flags==1) flags=0; ELSE flags=1; END
  1437.         x=father.x+get_distx(ángulo0,6);   // Coge las coordenadas respecto al cuerpo
  1438.         y=father.y-70+get_disty(ángulo0,4);// pero en con un movimiento tipo elipse
  1439.         graph=anim[ianim];             // Coge el gráfico necesario para la animación
  1440.         ianim=(ianim+1) mod 50;        // Incrementa el contador dentro de la cadena de animación
  1441.  
  1442.         // Haz sonido de oso cada 40 animaciones
  1443.         IF (ianim==40) sound(s_oso,100,128); END
  1444.         ángulo0+=pi/48;
  1445.  
  1446.         // Comprueba si se ha tocado al protagonista
  1447.         IF (id2=collision(TYPE jack))
  1448.             // Si el protagonista esta mas alto que el monstruo
  1449.             // y si el protagonista esta vivo
  1450.             IF (id2.muerte AND id2.y<=y)
  1451.                 incy=64;                    // Baja la cabeza del monstruo
  1452.                 id2.velocidad_gravedad=-26; // Cambia la gravedad
  1453.                 puntos++;                   // Suma puntuación
  1454.                 energia_enemigo--;          // Quita energía al monstruo
  1455.                 estrellas(x,y);             // Pone estrellas vistosas
  1456.                 sound(s_burbuja,100,256);   // Realiza sonido de burbuja
  1457.             END
  1458.         END
  1459.  
  1460.         // Sube la cabeza del monstruo si es que esta bajada
  1461.         IF (incy>0)
  1462.             y+=incy/2;
  1463.             FRAME;
  1464.             incy--;
  1465.         ELSE
  1466.             FRAME;
  1467.         END
  1468.     UNTIL (energia_enemigo==0)      // Repite mientras el monstruo tenga energía
  1469.  
  1470.     s_malvado=load_pcm("malvado\malvado.pcm",0); // Sonido Muerte de Doctor
  1471.     // Se crea un cuerpo de monstruo
  1472.     id2=objeto(1,104,father.x,father.y,8,1);
  1473.     signal(father,s_kill);      // Y elimina el anterior
  1474.     incy=-24;                   // Incremento de bajada del cuerpo
  1475.     sound(s_malvado,128,256);   // Haz sonido
  1476.     REPEAT
  1477.         id2.y+=(incy/2);             // Mueve el cuerpo
  1478.         incy++;                      // Reduce velocidad de caída
  1479.         y=id2.y-56;                   // Mueve la cabeza
  1480.         IF (incy MOD 8==0)           // Crea estrella cada 8 animaciones
  1481.             estrellas(x,y);
  1482.         END
  1483.         FRAME;
  1484.     UNTIL (y>350);                   //Mientras la cabeza no llegue al suelo
  1485.  
  1486.     // Pone la variable a uno para indicar que se ha acabo el nivel
  1487.     fin_nivel=true;
  1488. END
  1489.  
  1490.  
  1491. //-----------------------------------------------------------------------------
  1492. // Proceso para el objeto de monstruo final tercera fase
  1493. //-----------------------------------------------------------------------------
  1494. PROCESS malvado();
  1495.  
  1496. PRIVATE
  1497.     contador;                              // Contador de carácter general
  1498.     idcabeza;                       // Identificador para la cabeza del monstruo
  1499.  
  1500. BEGIN
  1501.     file=1;                         // Coge el fichero de gráficos uno
  1502.     ctype=c_scroll;                 // Pone el objeto en  el scroll
  1503.     x=552;                          // Inicializa coordenadas del objeto
  1504.     y=230;
  1505.     z=8;                            // Pone el cuerpo detrás (profundidad) de la cabeza
  1506.     idcabeza=malvado_cabeza();      // Crea cabeza del monstruo
  1507.  
  1508.     LOOP
  1509.         graph=200;                 // Pone gráfico inicial
  1510.         flags=0;                   // Pone mirando al protagonista (por defecto)
  1511.         FRAME(5000);               // Espera 50 frames (1 segundo aprox.)
  1512.         graph=203;                 // Cambia gráfico para animarlo
  1513.         FRAME(300);                // Espera 3 frames
  1514.         graph=204;                 // Cambia gráfico para animarlo
  1515.         FRAME(300);                // Espera 3 frames
  1516.         graph=205;                 // Cambia gráfico a monstruo tirando bombas
  1517.         bomba(x-38,y+24,-6);       // Crea un objeto bomba
  1518.         FRAME(400);                // Espera 4 frames
  1519.         graph=200;                 // Cambia gráfico para animarlo (inicial)
  1520.         FRAME(5000);               // Espera 50 frames
  1521.         graph=201;                 // Cambia gráfico
  1522.         idcabeza.graph=101;        // Cambia gráfico de la cabeza del monstruo
  1523.         FROM contador=-16 TO 16;
  1524.             // Si esta en el medio de la animación
  1525.             IF (contador==0)
  1526.                 graph=202;              // Cambia gráfico del cuerpo
  1527.                 idcabeza.graph=102;     // Cambia el gráfico de la cabeza
  1528.             END
  1529.             // Mueve al monstruo (salto)
  1530.             y+=contador;
  1531.             x-=14;
  1532.             FRAME;
  1533.         END
  1534.  
  1535.         idcabeza.graph=100;         // Cambia gráfico de la cabeza
  1536.         sound(s_toque,150,256);     // Haz sonido de toque
  1537.         graph=200;                  // Gráfico inicial
  1538.         flags=1;                    // Lo pone mirando hacia el muñeco
  1539.         FRAME(5000);                // Repite la animación de anterior
  1540.         graph=203;
  1541.         FRAME(300);
  1542.         graph=204;
  1543.         FRAME(300);
  1544.         graph=205;
  1545.         bomba(x+38,y+24,6);         // Crea bomba
  1546.         FRAME(400);
  1547.         graph=200;
  1548.         FRAME(5000);
  1549.         // Vuelve a saltar hacia el otro lado
  1550.         graph=201;
  1551.         idcabeza.graph=101;
  1552.         FROM contador=-16 TO 16;
  1553.             IF (contador==0)
  1554.                 graph=202;
  1555.                 idcabeza.graph=102;
  1556.             END
  1557.             y+=contador;
  1558.             x+=14;
  1559.             FRAME;
  1560.         END
  1561.  
  1562.         idcabeza.graph=100;
  1563.         // Realiza sonido de toque
  1564.         sound(s_toque,150,256);
  1565.     END
  1566. END
  1567.  
  1568.  
  1569. //-----------------------------------------------------------------------------
  1570. // Proceso para el objeto de la cabeza del monstruo
  1571. //-----------------------------------------------------------------------------
  1572.  
  1573.  
  1574. PROCESS malvado_cabeza();
  1575.  
  1576. PRIVATE
  1577.     ángulo0;                                 // Para movimiento tipo elipse
  1578.     id2;                                     // Identificador para crear un cuerpo nuevo
  1579.     incy;                                    // Para bajar la cabeza y quitar el monstruo al final
  1580.                                              // si el protagonista lo toca o lo mata
  1581. BEGIN
  1582.     file=1;                                  // Elige el fichero de gráficos 1
  1583.     graph=100;                               // Elige el gráfico inicial
  1584.     ctype=c_scroll;                          // Pone al objeto dentro del scroll
  1585.     z=4;                                     // Pone la cabeza por encima del cuerpo
  1586.  
  1587.     REPEAT
  1588.         flags=father.flags;                      // Coge la posición (der/izq) del cuerpo
  1589.         x=father.x-18+flags*36+get_distx(ángulo0,6); // Coge las coordenadas respecto al cuerpo
  1590.         y=father.y-32+get_disty(ángulo0,4);          // pero con movimiento tipo elipse
  1591.         ángulo0+=pi/48;                              // Incrementa el movimiento tipo elipse
  1592.         FRAME;
  1593.     UNTIL (energia_enemigo==0)                   // Mientras el monstruo tenga energía
  1594.  
  1595.     s_malvado=load_pcm("malvado\malvado.pcm",0); // Sonido Muerte de Doctor
  1596.     // Crea un nuevo cuerpo de monstruo
  1597.     id2=objeto(1,202,father.x,father.y,8,1);
  1598.     // Para eliminar el cuerpo de la cabeza
  1599.     signal(father,s_kill);
  1600.     incy=-24;                  // Selecciona velocidad de bajada(incremento
  1601.     graph=103;                 // Elige un gráfico de cabeza muerta
  1602.     flags=0;                   // Quita cualquier tipo de efecto espejo
  1603.     sound(s_malvado,100,256);  // Haz sonido
  1604.     REPEAT
  1605.         id2.y+=incy/2;         // Mueve el cuerpo (hacia abajo)
  1606.         incy++;                // Cada vez mas despacio
  1607.         y=id2.y-32;            // Mueve la cabeza hacia abajo
  1608.         x=id2.x-18;            // Y a la izquierda
  1609.         // Pon estrellas cada ocho animaciones
  1610.         IF (incy mod 8==0)
  1611.             estrellas(x,y);
  1612.         END
  1613.         FRAME;
  1614.     UNTIL (y>350);             // Repite mientras la cabeza no toque el suelo
  1615.     fin_nivel=true;            // Indica que se ha acabado el nivel
  1616. END
  1617.  
  1618. //-----------------------------------------------------------------------------
  1619. // Proceso para el objeto las bolas que tira el monstruo fase1
  1620. // Entradas: 'x' 'y'  coordenadas del objeto
  1621. //           'incr_x'     Incremento de movimiento (izq.der.)
  1622. //-----------------------------------------------------------------------------
  1623.  
  1624. PROCESS bola(x,y,incr_x);
  1625.  
  1626. BEGIN
  1627.     file=1;                             // Elige el fichero de gráficos 1
  1628.     graph=108;                          // Pon el gráfico de bola de fuego
  1629.     ctype=c_scroll;                     // Inclúyelo dentro del scroll
  1630.     z=4;                                // Por delante del cuerpo y la cabeza pero detrás del protagonista
  1631.     sound(s_toque,100,128);             // Haz sonido de toque
  1632.  
  1633.     REPEAT
  1634.         x+=incr_x;                          // Mueve el objeto
  1635.         graph++;
  1636.         // Realiza la animación de gráficos
  1637.         IF(graph>110) graph=108; END
  1638.         FRAME;
  1639.     UNTIL (x<3000 OR x>4000)           // Repite hasta que se salga de pantalla
  1640.  
  1641. END
  1642.  
  1643. //-----------------------------------------------------------------------------
  1644. // Proceso para las bombas que tira el monstruo final fase 3
  1645. // Entradas: 'x' 'y' Coordenadas del objeto
  1646. //           'inc'   Incremento horizontal (der/izq)
  1647. //-----------------------------------------------------------------------------
  1648.  
  1649.  
  1650. PROCESS bomba(x,y,incr_x);
  1651.  
  1652. PRIVATE
  1653.     incr_y;                                 // Posición vertical de la bomba
  1654.     iymax;                              // Posición máxima vertical de la bomba
  1655.     id2;                                // Identificador para hallar colisiones
  1656.     toque=false;                        // Variable para comprobar si la bomba la tira el monstruo
  1657.                                         // o la tira el protagonista
  1658. BEGIN
  1659.     file=1;                             // Elige los gráficos de fichero 1
  1660.     graph=300;                          // Pon gráfico inicial
  1661.     ctype=c_scroll;                     // Ponlo dentro del scroll
  1662.     z=4;                                // Pon por detrás del protagonista y delante del monstruo
  1663.     iymax=rand(-10,-22);                // Altura máxima de la bomba al azar (rand)
  1664.     incr_y=iymax;                       // Empieza en la altura máxima
  1665.     sound(s_toque,50,128);              // Realiza sonido de toque
  1666.  
  1667.     REPEAT
  1668.         y+=incr_y;                      // Mueve la bomba
  1669.         incr_y+=2;
  1670.         // Hace que la bomba bote
  1671.         IF (incr_y>-iymax)
  1672.             iymax+=2;
  1673.             incr_y=iymax;
  1674.             sound(s_toque,25,768);      // Pon sonido de toque
  1675.         END
  1676.         x+=incr_x;
  1677.  
  1678.         // Si la bomba la tira el monstruo
  1679.         IF (NOT toque)
  1680.             // Si la toca el protagonista
  1681.             IF (id2=collision(TYPE jack))
  1682.                 toque=TRUE;
  1683.                 // Si el protagonista esta vivo
  1684.                 IF (id2.muerte)
  1685.                     incr_x=-incr_x;                     // Cambia la dirección de la bomba
  1686.                     id2.velocidad_gravedad=-20; // Hace botar al protagonista
  1687.                     estrellas(x,y);             // Pone estrellas
  1688.                     puntos++;                   // Suma puntos
  1689.                     sound(s_burbuja,25,512);    // Pone sonido de pompa
  1690.                 ELSE
  1691.                     muerte_jack2();             // Si no mata al protagonista
  1692.                 END
  1693.             END
  1694.         END
  1695.  
  1696.         // La bomba toca al monstruo le quita energía
  1697.         IF (id2=collision(TYPE malvado))
  1698.             energia_enemigo--;
  1699.             BREAK;
  1700.         END
  1701.  
  1702.         FRAME;
  1703.     // Repite el proceso hasta que la bomba salga de pantalla
  1704.     UNTIL (x<64 OR x>640-64 OR iymax>=0)
  1705.  
  1706.     // Sonido de toque
  1707.     sound(s_toque,200,128);
  1708.     // Realiza animación
  1709.     FROM graph=301 TO 309;
  1710.         frame(200);                             // Espera dos frames por gráfico
  1711.     END
  1712.  
  1713. END
  1714.  
  1715. //-----------------------------------------------------------------------------
  1716. // Proceso para el objeto fuego
  1717. // Entradas: 'x' 'y' Coordenadas del objeto
  1718. //           'inc'   Máximo movimiento que realizara el objeto
  1719. //-----------------------------------------------------------------------------
  1720.  
  1721. PROCESS fuego(x,y,inc)
  1722.  
  1723. PRIVATE
  1724.     contador;                           // Contador de uso general
  1725.  
  1726. BEGIN
  1727.     ctype=c_scroll;                     // Pon el gráfico dentro del scroll
  1728.     LOOP
  1729.         graph=0;                        // Elige un gráfico nulo
  1730.         flags=0;                        // Sin ningún tipo de efecto espejo
  1731.         FROM contador=0 TO 23;          // Pon 24 gráficos
  1732.             FRAME;
  1733.         END
  1734.  
  1735.         graph=420;                      // Elige gráfico inicial
  1736.         suena_sonido(s_toque,50,128);   // Haz sonido de toque
  1737.  
  1738.         FOR (contador=-inc;contador<=inc;contador++);        // Realiza movimiento hasta el incremento (subida)
  1739.             IF (graph==420)             // Alterna los gráficos
  1740.                 graph=421;              // Si esta quitado lo pone
  1741.             ELSE                        // Y si esta puesto
  1742.                 graph=420;              // Lo quita
  1743.             END
  1744.             IF (contador==1)            // Si ha llegado arriba
  1745.                 flags=2;                // Da la vuelta al gráfico (mirando hacia abajo)
  1746.             END
  1747.             FRAME;
  1748.             y+=contador;                // Mueve objeto
  1749.         END
  1750.  
  1751.     END
  1752. END
  1753.  
  1754. //-----------------------------------------------------------------------------
  1755. // Proceso para el objeto de la barra de energía
  1756. //-----------------------------------------------------------------------------
  1757.  
  1758. PROCESS barra_energia();
  1759.  
  1760. BEGIN
  1761.     graph=10;                               // Elige el gráfico inicial
  1762.     x=160;                                  // Pon coordenadas
  1763.     y=220;
  1764.     z=-9;                                   // Pon la barra por encima de los gráficos
  1765.  
  1766.     WHILE (energia_enemigo>0)               // Mientras se tenga energía
  1767.         // Sube barra energía desde fuera de la pantalla a su posición
  1768.         IF (y>190)
  1769.             y--;
  1770.         ELSE
  1771.           IF (region!=10)                   // Si no tiene región créala
  1772.             region=10;
  1773.             objeto(0,11,160,190,-10,0);     // Crea detrás el gráfico de la barra vacía
  1774.           END
  1775.         END
  1776.         // Define la región respecto al tamaño de la barra de energía
  1777.         // y así solo ver la zona que representa a la misma
  1778.         define_region(10,120,185,1+energia_enemigo*5,10);
  1779.         FRAME;
  1780.     END
  1781.  
  1782.     // Elimina el proceso de la barra que hay detrás (barra vacía)
  1783.     signal(son,s_kill);
  1784. END
  1785.  
  1786. //-----------------------------------------------------------------------------
  1787. // Proceso para el objeto de la conexión bola de pinchos
  1788. // Entradas: 'x' 'y' Coordenadas del objeto
  1789. //-----------------------------------------------------------------------------
  1790.  
  1791. PROCESS bola_pin(x,y)
  1792.  
  1793. BEGIN
  1794.     file=1;                    // Elige el primer fichero de gráficos
  1795.     graph=20;                  // Elige el gráfico inicial
  1796.     ctype=c_scroll;            // Pone el objeto dentro del scroll
  1797.     priority=100;              // Pone la prioridad baja para ligar a la cadena
  1798.     cadena_bola(id,20);        // Crea cadena de pinchos
  1799.     z=-20;                     // Pone por encima de la pantalla
  1800.  
  1801.     LOOP
  1802.         angulo2+=pi/64;        // Mueve la cadena y la bola de pinchos
  1803.         FRAME;
  1804.     END
  1805.  
  1806. END
  1807.  
  1808. //-----------------------------------------------------------------------------
  1809. // Proceso para el objeto de cadena de bola de pinchos
  1810. // Entradas: 'primero'     Identificador a la conexión
  1811. //           'distancia'  Distancia a la conexión
  1812. //-----------------------------------------------------------------------------
  1813.  
  1814. PROCESS cadena_bola(primero,distancia)
  1815.  
  1816. BEGIN
  1817.     file=1;                             // Elige el primer fichero de gráficos
  1818.     graph=21;                           // Elige el gráfico inicial
  1819.     ctype=c_scroll;                     // Pone el objeto dentro del scroll
  1820.     z=-10;                              // Pone la cadena por detrás de la conexión
  1821.  
  1822.     IF (distancia<80)                       // Si el tamaño restante es lo suficientemente grande
  1823.         cadena_bola(primero,distancia+20);  // Crea otra bola de cadena
  1824.     ELSE
  1825.         bola_final(primero,distancia+32);   // Si no crea la bola de pinchos final
  1826.     END
  1827.  
  1828.     LOOP
  1829.         angulo2=primero.angulo2;                     // Coge el ángulo de la conexión
  1830.         x=primero.x+get_distx(angulo2,distancia);    // Halla las coordenadas respecto
  1831.         y=primero.y+get_disty(angulo2,distancia);    // a la conexión y al ángulo
  1832.         FRAME;
  1833.     END
  1834.  
  1835. END
  1836.  
  1837. //-----------------------------------------------------------------------------
  1838. // Proceso para el objeto de la bola de pinchos final
  1839. // Entradas: 'primero'     Identificador a la conexión
  1840. //           'distancia'  Distancia a la conexión
  1841. //-----------------------------------------------------------------------------
  1842.  
  1843. PROCESS bola_final(primero,distancia)
  1844.  
  1845. BEGIN
  1846.     file=1;                                      // Elige el fichero de gráficos 1
  1847.     graph=22;                                    // Pon el gráfico inicial
  1848.     ctype=c_scroll;                              // Dentro del scroll
  1849.     z=-20;                                       // Por delante de la cadena
  1850.  
  1851.     LOOP
  1852.         angulo2=primero.angulo2;                    // Coge el ángulo de la conexión
  1853.         x=primero.x+get_distx(angulo2,distancia);   // Actualiza coordenadas respecto a
  1854.         y=primero.y+get_disty(angulo2,distancia);   // la distancia a la conexión y el ángulo
  1855.         // Haz sonido de estrellas;
  1856.         suena_sonido(s_estrella,10,768);
  1857.         FRAME;
  1858.     END
  1859.  
  1860. END
  1861.  
  1862.  
  1863.  
  1864.  
  1865.